<?php
namespace CodeBase\Libs;
class Tree{
	/**无限极目录树生成方法
	 * [unlimited_level description]
	 * @param  [type]  $arr      [数组]
	 * @param  [type]  $pid_name [父id字段名]
	 * @param  string  $html     [分隔符默认空格]
	 * @param  integer $pid      [description]
	 * @param  integer $level    [description]
	 * @return [type]            [description]
	 */
	static public function unlimited_level($arr,$pid_name,$html='&nbsp;&nbsp;&nbsp;&nbsp',$pid=0,$level=0){
		$tmp=array();
		foreach ($arr as $v) {
			//查找顶层子分类
			if($v["$pid_name"]==$pid){
				$v['level']=$level;
				$v['html']=str_repeat($html, $level);
				$tmp[]=$v;
				//进行内部迭代
				// 为了解决局部变量作用域的问题,global和static的替代.
				$tmp=array_merge($tmp,self::unlimited_level($arr,$pid_name,$html,$v['id'],$level+1));
			}
		}
		return $tmp;
	}

	//返回所有子分类
	static public function unlimited_child($arr,$pid_name,$id=0){
	    $tmp=array();
	    foreach ($arr as $v) {
	        if($v["$pid_name"]==$id){
	            $tmp[]=$v['id'];
	            // $tmp[]=$v;
	            $tmp=array_merge($tmp,self::unlimited_child($arr,$pid_name,$v['id']));
	        }
	    }
	    return $tmp;
	}
	/**
	 * 传递id,返回所有非子分类的
	 * @param  [type]  &$arr     [description]
	 * @param  [type]  $pid_name [description]
	 * @param  integer $id       [description]
	 * @return [type]            [description]
	 */
	static public function unlimited_notchild(&$arr,$pid_name,$id=0){
	    foreach ($arr as $k=>$v) {
	        if($v["$pid_name"]==$id || $v["id"]==$id){
	            $arr[$k] = null; //不直接删除 设置为空
	            self::unlimited_notchild($arr,$pid_name,$v['id']);
	        }
	    }
	    /* array_filter 清理空值 */
	    /* array_values 取数组值 用处是重置下标 */
	    return array_values(array_filter($arr));
	}

	//传递id,返回该id所有的父分类
	static public function unlimited_parents($arr,$pid_name,$cid){
		$tmp=array();
		foreach ($arr as $v) {
			//如果数组中的id
			if($v['id']==$cid){
				$tmp[]=$v;
				$tmp=array_merge($tmp,self::unlimited_parents($arr,$pid_name,$v["$pid_name"]));
			}
		}
		return $tmp;
	}
    /**
     * 来源:onthink
     * 数组转换成tree形式的数组
     * @param $list 要转换的数据
     * @param string $pk    主键id名称
     * @param string $pid   父id名称
     * @param string $child 子数组标记字段名称
     * @param int $root 顶层分类的id值
     * @return array
     */
    static public function unlimited_to_tree($list, $pk='id', $pid = 'pid', $child = 'son', $root = 0) {
        // 创建Tree
        $tree = array();
        if(is_array($list)) {
            // 创建基于主键的数组引用
            $refer = array();
            foreach ($list as $key => $data) {
                $refer[$data[$pk]] =& $list[$key];
            }
            foreach ($list as $key => $data) {
                // 判断是否存在parent
                $parentId = $data[$pid];
                if ($root == $parentId) {
                    $tree[] =& $list[$key];
                }else{
                    if (isset($refer[$parentId])) {
                        $parent =& $refer[$parentId];
                        $parent[$child][] =& $list[$key];
                    }
                }
            }
        }
        return $tree;
    }
}